package demo16_volatile;

import java.util.Arrays;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger;

/**
 * @author kunkun
 * @className Test03_Volatile
 * @Description 不保证原子性
 * @date 2025/3/7 16:29
 */
public class Test03_Volatile {

//    static volatile int num = 0;
    static   AtomicInteger num = new AtomicInteger();

    //问题展示
//    public synchronized static void add(){
//        num++;
//    }
//
//    //解决方法1：使用同步代码块/锁
//    public synchronized static void add1(){
//        num++;
//    }

    //解决方法2：使用原子类 Atomic
    public static void add2(){
        num.getAndIncrement();
    }



    public static void main(String[] args) throws InterruptedException {
        //1. 开启线程
        for (int i = 0; i < 20; i++) {
            new Thread(()->{
                for (int i1 = 0; i1 < 10000; i1++) {
//                    add();
//                    add1();
                    add2();
                }
            }).start();
        }

        //2. 等待所有线程执行完毕
        while (Thread.activeCount()>2){
            Thread.yield();
        }
        System.out.println("所有线程执行完毕，num="+num);//52080，应该是20_0000

    }



}
